package concurrent;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * 因为permit默认是0，所以一开始调用park()方法，线程必定会被阻塞。
 * 调用unpark(thread)方法后，会自动唤醒thread线程，即park方法立即返回。
 * <p>
 * 唤醒方法在等待方法之前执行，线程也能够被唤醒，这点是另外2中方法无法做到的。
 * Object和Condition中的唤醒必须在等待之后调用，线程才能被唤醒。
 * 而LockSupport中，唤醒的方法不管是在等待之前还是在等待之后调用，线程都能够被唤醒。
 *
 * @author jack.wu
 * @since 2019/12/26 13:33
 */
public class LockSupportDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("In Son Thread");
            // 等待
            LockSupport.park();
            System.out.println("Son被唤醒。。");
        });
        thread.setName("Thread - son");
        thread.start();
        TimeUnit.SECONDS.sleep(2);
        // 唤醒
        LockSupport.unpark(thread);
    }
}
